import type { MapDataItem } from './extractModelData';

// 默认地图展示poi
const _baseMapOptions = {
  type: 'vector',
  features: ['base', 'building3d', 'building2d', 'point', 'label'],
};

/**
 * 地图服务类，负责地图的初始化、操作和事件管理
 */
export class MapService {
  private map: any = null;
  private TMap: any = null;
  private eventHandlers: Map<string, Function> = new Map();

  /**
   * 构造函数
   * @param TMap TMap API实例
   */
  constructor(TMap: any) {
    this.TMap = TMap;
  }

  /**
   * 初始化地图
   * @param container 地图容器元素
   * @returns 地图实例
   */
  public async initMap(container: HTMLElement): Promise<any> {
    if (!container) return null;


    try {
      // 创建地图实例
      this.map = new this.TMap.Map(container, {
        center: new this.TMap.LatLng(31.81463441290719, 117.30756555604191),
        zoom: 17,
      });

      // 设置基础底层
      this.map.setBaseMap(_baseMapOptions);

      // 添加地图事件监听
      this.map.on('zoomend', this.handleEvent.bind(this, 'zoomend'));
      this.map.on('rotateend', this.handleEvent.bind(this, 'rotateend'));
      this.map.on('moveend', this.handleEvent.bind(this, 'moveend'));

      return this.map;
    } catch (error) {
      console.error('地图初始化失败:', error);
      return null;
    }
  }

  /**
   * 添加事件监听器
   * @param eventName 事件名称
   * @param handler 事件处理函数
   */
  public on(eventName: string, handler: Function): void {
    this.eventHandlers.set(eventName, handler);
  }

  /**
   * 移除事件监听器
   * @param eventName 事件名称
   */
  public off(eventName: string): void {
    this.eventHandlers.delete(eventName);
  }

  /**
   * 处理地图事件
   * @param eventName 事件名称
   * @param event 事件对象
   */
  private handleEvent(eventName: string, event: any): void {
    const handler = this.eventHandlers.get(eventName);
    if (handler) {
      handler(event);
    }
  }

  /**
   * 获取当前地图缩放级别
   * @returns 缩放级别
   */
  public getZoom(): number {
    if (!this.map) return 0;
    return this.map.getZoom();
  }

  /**
   * 设置地图缩放级别
   * @param zoom 缩放级别
   */
  public setZoom(zoom: number): void {
    if (this.map) {
      this.map.setZoom(zoom);
    }
  }

  /**
   * 设置地图中心点
   * @param lat 纬度
   * @param lon 经度
   */
  public setCenter(lat: number, lon: number): void {
    if (this.map && this.TMap) {
      this.map.setCenter(new this.TMap.LatLng(lat, lon));
    }
  }

  /**
   * 获取地图实例
   * @returns 地图实例
   */
  public getMapInstance(): any {
    return this.map;
  }

  /**
   * 定位到指定位置
   * @param item 模型数据项
   */
  public locateToPosition(item: MapDataItem): void {
    if (!this.map || !this.TMap) return;

    try {
      // 设置地图中心到指定位置
      this.map.setCenter(new this.TMap.LatLng(item.lat, item.lon));

      // 确保缩放级别足够高以显示模型
      const currentZoom = this.map.getZoom();
      if (currentZoom < 17) {
        this.map.setZoom(18);
      }
    } catch (error) {
      console.error('定位失败:', error);
    }
  }

  /**
   * 销毁地图实例
   */
  public destroy(): void {
    if (this.map) {
      // 移除所有事件监听
      this.eventHandlers.clear();

      // 销毁地图实例
      this.map.destroy();
      this.map = null;
    }
  }
}